package echiquier;

import java.util.HashSet;

import piece.Piece;
import core.AnnulationException;
import core.Coordonnees;
import core.DeplacementException;

public class Deplacement {
	public Coordonnees coordDestination;
	public Coordonnees coordSource;
	
	public Piece pieceElimine;
	
	public Deplacement(Piece piece, Coordonnees coordDestination) {
		this.coordDestination = coordDestination;
		
		this.coordSource = piece.getCase().getCoordonnees();
		this.pieceElimine = null;
	}
	
	public Deplacement(Coordonnees coordSource, Coordonnees coordDestination) {
		this.coordDestination = coordDestination;
		
		this.coordSource = coordSource;
		this.pieceElimine = null;
	}
	
	public void deplace(Echiquier echiquier) throws DeplacementException {
		Piece piece = echiquier.getPieceCase(coordSource);
		
		//récupération de la case de destination
		Case caseDest = echiquier.getPlateau().get(coordDestination);
		
		HashSet<Case> casePossible = Echiquier_deplacement_Utils.peutAtteindre(piece, echiquier.getPlateau());
		//si la case de destination n'est pas nulle et qu'elle est compris dans les possibilité de mouvement de la pièce et que la pièce n'est pas éliminé
		if (piece != null && caseDest != null && casePossible.contains(caseDest)) {
			//on déplace la pièce en enregistrant l'éventuelle pièce éliminée
			pieceElimine = piece.deplace(caseDest);
		} else {
			throw new DeplacementException();
		}
	}
	
	public void annule(Echiquier echiquier) throws AnnulationException {
		Piece piece = echiquier.getPieceCase(coordDestination);
		//récupération de la case source
		Case caseDestination = echiquier.getPlateau().get(coordDestination);
		Case caseSource = echiquier.getPlateau().get(coordSource);
		
		//vérification des paramètres du déplacement
		if (caseDestination != null && caseSource != null && caseSource.isFree() && piece.getCase() == caseDestination && caseDestination.getPiece() == piece) {
			piece.annuleDeplacement(caseSource);
			if (pieceElimine != null)
				pieceElimine.annulePrise(caseDestination);
		//si les paramètres ne sont pas valides, on renvois une exception d'annulation
		} else {
			throw new AnnulationException();
		}
	}
	
	public boolean estValide(Echiquier echiquier) {
		boolean res = true;
		try {
			deplace(echiquier);
			
			if (echiquier.getZoneMenace().contains(echiquier.getJeuCourant().getRoi().getCase())) {
				res = false;
			}
			
			annule(echiquier);
		} catch (DeplacementException e) {
			res = false;
		} catch (AnnulationException e) {
			res = false;
		}
		
		return res;
	}
}
